home *** CD-ROM | disk | FTP | other *** search
/ Amoszine 11 / Amoszine 11 (Disk 2 of 2).adf / Loads_Of_Source.lha / filereq_creator.amos / filereq_creator.amosSourceCode
AMOS Source Code  |  1996-03-06  |  16KB  |  811 lines

  1. Set Buffer 10
  2.  
  3. ' ********************** 
  4. ' *** FILE REQUESTER *** 
  5. ' ********************** 
  6.  
  7. '
  8. ' A bit buggy and needs sorting I think!!! :(
  9.  
  10. ' *** This Routine Lets You Create & Use A File-Requester, Instead Of The
  11. '     Normal AMOS One Provided.
  12.  
  13. ' *** MAXIMUM FILES ALLOWED. 
  14.  
  15. MXFILES=200
  16.  
  17. ' *** MAXIMUM DEVICES ALLOWED. 
  18.  
  19. MXDEVS=50
  20.  
  21. ' *** DEFINE VARIABLES.
  22.  
  23. Dim FILE$(MXFILES),DEVS$(MXDEVS)
  24.  
  25. ' *** MAKE VARIABLES GLOBAL.   
  26.  
  27. Global AN,ED$,MXFILES,MXDEVS
  28. Global PATH$,CPATH$,DEV$,POSF,POSD,FILE$(),DEVS$(),FIL$,DEV$,FILES,DEVS
  29.  
  30. ' *** SET DEFAULT PATH, ONLY CHANGE PATH$ AND NOT CPATH$.
  31.  
  32. PATH$="RAM:"
  33. CPATH$="Ram Disk:"
  34. POSF=0
  35. POSD=0
  36.  
  37. ' *** CALL FILE REQUESTER. 
  38.  
  39. FILREQ["SELECT A FILE."]
  40.  
  41. ' *** PRINT SELECTED FILE. 
  42.  
  43. Locate 0,0
  44. Print "You selected :-"
  45. Print 
  46. Pen 0
  47. Paper 5
  48. Print FIL$
  49. Pen 2
  50. Paper 1
  51.  
  52. ' *** QUIT.
  53.  
  54. Direct 
  55.  
  56. Procedure FILREQ[TITLE$]
  57.    
  58.    ' *** FILE REQUESTER VALUES. 
  59.    
  60.    ' *** BY CHANGING THESE VALUES, YOU CAN DESIGN YOUR OWN FILE-REQUESTER.
  61.    
  62.    _TITLE_X1=4
  63.    _TITLE_Y1=5
  64.    _TITLE_X2=635
  65.    _TITLE_Y2=23
  66.    
  67.    _OK_X1=232
  68.    _OK_Y1=142
  69.    _OK_X2=332
  70.    _OK_Y2=158
  71.    
  72.    _CANCEL_X1=4
  73.    _CANCEL_Y1=142
  74.    _CANCEL_X2=104
  75.    _CANCEL_Y2=158
  76.    
  77.    _PARENT_X1=118
  78.    _PARENT_Y1=142
  79.    _PARENT_X2=218
  80.    _PARENT_Y2=158
  81.    
  82.    _FILE_X1=4
  83.    _FILE_Y1=29
  84.    _FILE_X2=332
  85.    _FILE_Y2=120
  86.    _FILE_X=1
  87.    _FILE_Y=4
  88.    _FILE_LINES=10
  89.    _FILE_WIDTH=40
  90.    _FILE_UP_X1=336
  91.    _FILE_UP_Y1=29
  92.    _FILE_UP_X2=352
  93.    _FILE_UP_Y2=39
  94.    _FILE_DOWN_X1=336
  95.    _FILE_DOWN_Y1=148
  96.    _FILE_DOWN_X2=352
  97.    _FILE_DOWN_Y2=158
  98.    _FILE_SLIDER_X1=336
  99.    _FILE_SLIDER_Y1=41
  100.    _FILE_SLIDER_X2=352
  101.    _FILE_SLIDER_Y2=146
  102.    
  103.    _DEVICE_X1=364
  104.    _DEVICE_Y1=29
  105.    _DEVICE_X2=614
  106.    _DEVICE_Y2=120+24
  107.    _DEVICE_X=46
  108.    _DEVICE_Y=4
  109.    _DEVICE_LINES=13
  110.    _DEVICE_WIDTH=30
  111.    _DEVICE_UP_X1=619
  112.    _DEVICE_UP_Y1=29
  113.    _DEVICE_UP_X2=635
  114.    _DEVICE_UP_Y2=39
  115.    _DEVICE_DOWN_X1=619
  116.    _DEVICE_DOWN_Y1=148
  117.    _DEVICE_DOWN_X2=635
  118.    _DEVICE_DOWN_Y2=158
  119.    _DEVICE_SLIDER_X1=619
  120.    _DEVICE_SLIDER_Y1=41
  121.    _DEVICE_SLIDER_X2=635
  122.    _DEVICE_SLIDER_Y2=146
  123.    
  124.    _PATH_X1=4
  125.    _PATH_Y1=124
  126.    _PATH_X2=332
  127.    _PATH_Y2=138
  128.    _PATH_X=1
  129.    _PATH_Y=16
  130.    _PATH_WIDTH=40
  131.    
  132.    _INFO_X1=364
  133.    _INFO_Y1=148
  134.    _INFO_X2=614
  135.    _INFO_Y2=158
  136.    
  137.    ' *** OPEN SCREEN FOR REQUESTER. 
  138.    
  139.    Screen Open 7,640,164,4,Hires
  140.    Flash Off 
  141.    Curs Off 
  142.    Cls 0
  143.    Pen 3
  144.    Paper 0
  145.    
  146.    Palette $AAA,$FFF,$333,$FF0
  147.    
  148.    ' *** DRAW TITLE.. 
  149.    
  150.    B[_TITLE_X1,_TITLE_Y1,_TITLE_X2,_TITLE_Y2,TITLE$,1]
  151.    
  152.    ' *** DRAW FILE PART.
  153.    
  154.    B[_FILE_X1,_FILE_Y1,_FILE_X2,_FILE_Y2,"",0]
  155.    
  156.    For LOP=_FILE_Y To _FILE_Y+_FILE_LINES
  157.       Locate _FILE_X,LOP
  158.       Print Space$(_FILE_WIDTH);
  159.    Next 
  160.    
  161.    B[_FILE_UP_X1,_FILE_UP_Y1,_FILE_UP_X2,_FILE_UP_Y2,"<",1]
  162.    B[_FILE_SLIDER_X1,_FILE_SLIDER_Y1,_FILE_SLIDER_X2,_FILE_SLIDER_Y2,"",0]
  163.    B[_FILE_DOWN_X1,_FILE_DOWN_Y1,_FILE_DOWN_X2,_FILE_DOWN_Y2,">",1]
  164.    
  165.    ' *** DRAW DEVICE PART.
  166.    
  167.    B[_DEVICE_X1,_DEVICE_Y1,_DEVICE_X2,_DEVICE_Y2,"",0]
  168.    
  169.    B[_DEVICE_UP_X1,_DEVICE_UP_Y1,_DEVICE_UP_X2,_DEVICE_UP_Y2,"<",1]
  170.    B[_DEVICE_SLIDER_X1,_DEVICE_SLIDER_Y1,_DEVICE_SLIDER_X2,_DEVICE_SLIDER_Y2,"",0]
  171.    B[_DEVICE_DOWN_X1,_DEVICE_DOWN_Y1,_DEVICE_DOWN_X2,_DEVICE_DOWN_Y2,">",1]
  172.    
  173.    For Z=_DEVICE_Y To _DEVICE_Y+_DEVICE_LINES
  174.       Locate _DEVICE_X,Z
  175.       Print String$(" ",_DEVICE_WIDTH)
  176.    Next 
  177.    
  178.    ' *** DRAW TEXT BOXES. 
  179.    
  180.    B[_PATH_X1,_PATH_Y1,_PATH_X2,_PATH_Y2,"",0]
  181.    
  182.    Locate _PATH_X,_PATH_Y
  183.    Print String$(" ",_PATH_WIDTH)
  184.    
  185.    ' *** DRAW BUTTONS.
  186.    
  187.    B[_CANCEL_X1,_CANCEL_Y1,_CANCEL_X2,_CANCEL_Y2,"Cancel",1]
  188.    B[_OK_X1,_OK_Y1,_OK_X2,_OK_Y2,"O.K",1]
  189.    B[_PARENT_X1,_PARENT_Y1,_PARENT_X2,_PARENT_Y2,"Parent",1]
  190.    
  191.    ' *** DRAW INFO BUTTON.
  192.    
  193.    B[_INFO_X1,_INFO_Y1,_INFO_X2,_INFO_Y2,"",1]
  194.    
  195.    ' *** DRAW ANYTHING ELSE HERE. 
  196.    
  197.    Ink 2
  198.    Draw 0,163 To 639,163
  199.    
  200.    ' *** RESET FILE STRING. 
  201.    
  202.    FIL$=""
  203.    
  204.    ' *** CHECK IF DIRECTORY TAKEN BEFORE. 
  205.    
  206.    If PATH$<>CPATH$
  207.       Gosub _GET_DIR
  208.    Else 
  209.       Gosub DISPF
  210.       Gosub DISPD
  211.       Gosub DISPP
  212.    End If 
  213.    
  214.    ' *** MAIN LOOP. 
  215.    
  216.    Do 
  217.       
  218.       ' *** SCROLL UP 1 FILE.
  219.       
  220.       R[_FILE_UP_X1,_FILE_UP_Y1,_FILE_UP_X2,_FILE_UP_Y2]
  221.       If AN>0 and POSF>0
  222.          Dec POSF
  223.          Gosub DISPF
  224.       End If 
  225.       
  226.       ' *** SCROLL DOWN 1 FILE.
  227.       
  228.       R[_FILE_DOWN_X1,_FILE_DOWN_Y1,_FILE_DOWN_X2,_FILE_DOWN_Y2]
  229.       If AN>0 and POSF<FILES-_FILE_LINES
  230.          Inc POSF
  231.          Gosub DISPF
  232.       End If 
  233.       
  234.       ' *** SCROLL UP 1 DEVICE.
  235.       
  236.       R[_DEVICE_UP_X1,_DEVICE_UP_Y1,_DEVICE_UP_X2,_DEVICE_UP_Y2]
  237.       If AN>0 and POSD>0
  238.          Dec POSD
  239.          Gosub DISPD
  240.       End If 
  241.       
  242.       ' *** SCROLL DOWN 1 DEVICE.
  243.       
  244.       R[_DEVICE_DOWN_X1,_DEVICE_DOWN_Y1,_DEVICE_DOWN_X2,_DEVICE_DOWN_Y2]
  245.       If AN>0 and POSD<DEVS-_DEVICE_LINES
  246.          Inc POSD
  247.          Gosub DISPD
  248.       End If 
  249.       
  250.       ' *** SELECT FILE. 
  251.       
  252.       For LOP=0 To _FILE_LINES
  253.          R[_FILE_X1,_FILE_Y1+(LOP*8),_FILE_X2,_FILE_Y1+(LOP*8)+8]
  254.          If AN
  255.             FIL$=FILE$(POSF+LOP)
  256.             Gosub CUT_FIL
  257.             Gosub DISPP
  258.          End If 
  259.       Next LOP
  260.       
  261.       ' *** SELECT DEVICE..  
  262.       
  263.       For LOP=0 To _DEVICE_LINES
  264.          R[_DEVICE_X1,_DEVICE_Y1+(LOP*8),_DEVICE_X2,_DEVICE_Y1+(LOP*8)+8]
  265.          If AN
  266.             PATH$=DEVS$(POSD+LOP)
  267.             Gosub CUT_DEV
  268.             Gosub _GET_DIR
  269.          End If 
  270.       Next LOP
  271.       
  272.       ' *** GRAB FILES SLIDER. 
  273.       
  274.       XSLI=_FILE_SLIDER_X1+2
  275.       YSLI=_FILE_SLIDER_Y1+2
  276.       SXSLI=_FILE_SLIDER_X2-_FILE_SLIDER_X1-2
  277.       SYSLI=_FILE_SLIDER_Y2-_FILE_SLIDER_Y1-2
  278.       LBANK=FILES+1
  279.       SYBANK=_FILE_LINES+1
  280.       PBANK=POSF+1
  281.       
  282.       If FILES>_FILE_LINES
  283.          R[XSLI,SSL,XSLI+SXSLI,ESL]
  284.          If AN
  285.             
  286.             MY=Y Screen(Y Mouse)
  287.             DY=MY-SSL
  288.             Repeat 
  289.                MX=X Screen(X Mouse)
  290.                MY=Y Screen(Y Mouse)
  291.                MK=Mouse Key
  292.                Y=MY-YSLI-DY
  293.                POSF=(Y*(LBANK+1))/SYSLI+1
  294.                If POSF<0
  295.                   POSF=0
  296.                End If 
  297.                If POSF>LBANK-SYBANK
  298.                   POSF=LBANK-SYBANK
  299.                End If 
  300.                If POSF<>PBANK
  301.                   PBANK=POSF
  302.                   Gosub DISPF
  303.                End If 
  304.             Until MK=0
  305.             
  306.          End If 
  307.       End If 
  308.       
  309.       ' *** GRAB DEVICES SLIDER. 
  310.       
  311.       XSLI=_DEVICE_SLIDER_X1+2
  312.       YSLI=_DEVICE_SLIDER_Y1+2
  313.       SXSLI=_DEVICE_SLIDER_X2-_DEVICE_SLIDER_X1-2
  314.       SYSLI=_DEVICE_SLIDER_Y2-_DEVICE_SLIDER_Y1-2
  315.       LBANK=DEVS+1
  316.       SYBANK=_DEVICE_LINES+1
  317.       PBANK=POSD+1
  318.       
  319.       If DEVS>_DEVICE_LINES
  320.          R[XSLI,SSL,XSLI+SXSLI,ESL]
  321.          If AN
  322.             
  323.             MY=Y Screen(Y Mouse)
  324.             DY=MY-SSL
  325.             Repeat 
  326.                MX=X Screen(X Mouse)
  327.                MY=Y Screen(Y Mouse)
  328.                MK=Mouse Key
  329.                Y=MY-YSLI-DY
  330.                POSD=(Y*(LBANK+1))/SYSLI+1
  331.                If POSD<0
  332.                   POSD=0
  333.                End If 
  334.                If POSD>LBANK-SYBANK
  335.                   POSD=LBANK-SYBANK
  336.                End If 
  337.                If POSD<>PBANK
  338.                   PBANK=POSD
  339.                   Gosub DISPD
  340.                End If 
  341.             Until MK=0
  342.             
  343.          End If 
  344.       End If 
  345.       
  346.       ' *** O.K BUTTON.
  347.       
  348.       R[_OK_X1,_OK_Y1,_OK_X2,_OK_Y2]
  349.       If AN
  350.          If FIL$=""
  351.             FIL$=""
  352.          Else 
  353.             FIL$=PATH$+FIL$
  354.          End If 
  355.          Goto FIN
  356.       End If 
  357.       
  358.       ' *** PARENT BUTTON. 
  359.       
  360.       R[_PARENT_X1,_PARENT_Y1,_PARENT_X2,_PARENT_Y2]
  361.       If AN
  362.          Gosub _PARENT
  363.       End If 
  364.       
  365.       ' *** CANCEL BUTTON. 
  366.       
  367.       R[_CANCEL_X1,_CANCEL_Y1,_CANCEL_X2,_CANCEL_Y2]
  368.       If AN
  369.          FIL$=""
  370.          Goto FIN
  371.       End If 
  372.       
  373.       ' *** EDIT REQUESTER PATH. 
  374.       
  375.       R[_PATH_X1,_PATH_Y1,_PATH_X2,_PATH_Y2]
  376.       If AN
  377.          ED[_PATH_X,_PATH_Y,"",PATH$,_PATH_WIDTH,120]
  378.          If Right$(PATH$,1)<>"/"
  379.             PATH$=PATH$+"/"
  380.          End If 
  381.          PATH$=ED$
  382.          Gosub _GET_DIR
  383.       End If 
  384.       '
  385.    Loop 
  386.    
  387.    ' *** GET PARENT DIRECTORY.
  388.    
  389.    _PARENT:
  390.    
  391.    If Len(PATH$)>2
  392.       
  393.       For LOP=Len(PATH$)-1 To 1 Step -1
  394.          A$=Mid$(PATH$,LOP,1)
  395.          If(A$="/") or(A$=":")
  396.             PATH$=Left$(PATH$,LOP)
  397.             Gosub _GET_DIR
  398.             Gosub DISPF
  399.             Exit 
  400.          End If 
  401.       Next LOP
  402.       
  403.    End If 
  404.    
  405.    Return 
  406.    
  407.    ' *** EXIT REQUESTER WITH SELECTED FILENAME. 
  408.    
  409.    FIN:
  410.    
  411.    Screen Close 7
  412.    Pop Proc
  413.    
  414.    ' *** THIS CUTS A DEVICE INTO A DIR-ABLE NAME. 
  415.    
  416.    CUT_FIL:
  417.    
  418.    For LOP=_FILE_WIDTH-9 To 1 Step -1
  419.       If Mid$(FIL$,LOP,1)<>" "
  420.          FIL$=Left$(FIL$,LOP)
  421.          Exit 
  422.       End If 
  423.    Next LOP
  424.    
  425.    A$=Left$(FIL$,1)
  426.    FIL$=Mid$(FIL$,2)
  427.    
  428.    If A$="*"
  429.       PATH$=PATH$+FIL$+"/"
  430.       FIL$=""
  431.       Gosub _GET_DIR
  432.       Gosub DISPF
  433.    End If 
  434.    
  435.    Return 
  436.    
  437.    ' *** THIS CUTS A DEVICE INTO A DIR-ABLE NAME. 
  438.    
  439.    CUT_DEV:
  440.    
  441.    For LOP=Len(PATH$) To 1 Step -1
  442.       If Mid$(PATH$,LOP,1)<>" "
  443.          PATH$=Left$(PATH$,LOP)
  444.          Exit 
  445.       End If 
  446.    Next LOP
  447.    
  448.    PATH$=Mid$(PATH$,2)
  449.    
  450.    If Right$(PATH$,1)<>":"
  451.       PATH$=PATH$+":"
  452.    End If 
  453.    
  454.    Return 
  455.    
  456.    ' *** GET FILES & DEVICES LIST.
  457.    
  458.    _GET_DIR:
  459.    
  460.    If Not Exist(PATH$)
  461.       I$="PATH NOT FOUND !"
  462.       Gosub INFO
  463.       Wait 50
  464.       I$=""
  465.       Gosub INFO
  466.       PATH$=CPATH$
  467.       Gosub DISPP
  468.       Return 
  469.    End If 
  470.    
  471.    ' *** ERASE PREVIOUS DIRECTORY.
  472.    
  473.    For LOP=0 To MXFILES
  474.       FILE$(LOP)=""
  475.    Next LOP
  476.    For LOP=0 To MXDEVS
  477.       DEVS$(LOP)=""
  478.    Next LOP
  479.    
  480.    I$="READING DIRECTORY..."
  481.    Gosub INFO
  482.    
  483.    Set Dir _FILE_WIDTH-8
  484.    
  485.    FILES=0
  486.    FILE$(FILES)=Dir First$(PATH$)
  487.    
  488.    While FILE$(FILES)<>""
  489.       Inc FILES
  490.       FILE$(FILES)=Dir Next$
  491.    Wend 
  492.    Dec FILES
  493.    
  494.    Set Dir _DEVICE_WIDTH-8
  495.    
  496.    DEVS=0
  497.    DEVS$(DEVS)=Dev First$("")
  498.    
  499.    While DEVS$(DEVS)<>""
  500.       Inc DEVS
  501.       DEVS$(DEVS)=Dev Next$
  502.    Wend 
  503.    Dec DEVS
  504.    
  505.    I$=""
  506.    Gosub INFO
  507.    
  508.    CPATH$=PATH$
  509.    
  510.    POSF=0
  511.    
  512.    Gosub DISPF
  513.    Gosub DISPD
  514.    Gosub DISPP
  515.    
  516.    Return 
  517.    
  518.    ' *** DISPLAY PATH & FILENAME. 
  519.    
  520.    DISPP:
  521.    
  522.    Locate _PATH_X,_PATH_Y
  523.    Print Space$(_PATH_WIDTH);
  524.    Locate _PATH_X,_PATH_Y
  525.    Print Left$(PATH$+FIL$,_PATH_WIDTH);
  526.    
  527.    Return 
  528.    
  529.    ' *** DISPLAY INFO.
  530.    
  531.    INFO:
  532.    
  533.    B[_INFO_X1+1,_INFO_Y1,_INFO_X2-1,_INFO_Y2,I$,2]
  534.    
  535.    Return 
  536.    
  537.    ' *** DISPLAY FILES. 
  538.    
  539.    DISPF:
  540.    
  541.    For LOP=POSF To POSF+_FILE_LINES
  542.       Locate _FILE_X,LOP-POSF+_FILE_Y
  543.       If FILE$(LOP)<>""
  544.          Print FILE$(LOP);
  545.       Else 
  546.          Print Space$(_FILE_WIDTH);
  547.       End If 
  548.    Next LOP
  549.    
  550.    ' *** DISPLAY FILES SLIDER.
  551.    
  552.    XSLI=_FILE_SLIDER_X1+2
  553.    YSLI=_FILE_SLIDER_Y1+2
  554.    SXSLI=_FILE_SLIDER_X2-_FILE_SLIDER_X1-3
  555.    SYSLI=_FILE_SLIDER_Y2-_FILE_SLIDER_Y1-2
  556.    LBANK=FILES+1
  557.    SYBANK=_FILE_LINES+1
  558.    PBANK=POSF+1
  559.    
  560.    Cls 0,XSLI,YSLI To XSLI+SXSLI,YSLI+SYSLI
  561.    If LBANK>=SYBANK
  562.       SSL=YSLI+(SYSLI*(PBANK-1))/LBANK
  563.       ESL=Min(YSLI+SYSLI,SSL+(SYSLI*SYBANK)/LBANK)
  564.       Cls 3,XSLI,SSL To XSLI+SXSLI,ESL
  565.    End If 
  566.    
  567.    Return 
  568.    
  569.    ' *** DISPLAY DEVICES: 
  570.    
  571.    DISPD:
  572.    
  573.    For LOP=POSD To POSD+_DEVICE_LINES
  574.       Locate _DEVICE_X,LOP-POSD+_DEVICE_Y
  575.       If DEVS$(LOP)<>""
  576.          Print DEVS$(LOP);
  577.       Else 
  578.          Print Space$(_DEVICE_WIDTH);
  579.       End If 
  580.    Next LOP
  581.    
  582.    ' *** DISPLAY DEVICES SLIDER.
  583.    
  584.    XSLI=_DEVICE_SLIDER_X1+2
  585.    YSLI=_DEVICE_SLIDER_Y1+2
  586.    SXSLI=_DEVICE_SLIDER_X2-_DEVICE_SLIDER_X1-3
  587.    SYSLI=_DEVICE_SLIDER_Y2-_DEVICE_SLIDER_Y1-2
  588.    LBANK=DEVS+1
  589.    SYBANK=_DEVICE_LINES+1
  590.    PBANK=POSD+1
  591.    
  592.    Cls 0,XSLI,YSLI To XSLI+SXSLI,YSLI+SYSLI
  593.    If LBANK>=SYBANK
  594.       SSL=YSLI+(SYSLI*(PBANK-1))/LBANK
  595.       ESL=Min(YSLI+SYSLI,SSL+(SYSLI*SYBANK)/LBANK)
  596.       Cls 3,XSLI,SSL To XSLI+SXSLI,ESL
  597.    End If 
  598.    
  599.    Return 
  600.    
  601. End Proc
  602.  
  603. Procedure ED[XX,YY,MSG$,ED$,SX,ML]
  604.  
  605.    CCCC=0
  606.    MID=39-Int(SX/2)
  607.    If XX=0 and YY=0
  608.       Screen Open 7,640,38,8,Hires
  609.       Screen Display 7,,147,,
  610.       Curs Off 
  611.       Flash Off 
  612.       Cls 0
  613.       Pen 6
  614.       Paper 4
  615.       Palette $AA,$EEE,$DD,$77,$AA,$A0,$FE3,$44
  616.       CCCC=1
  617.       XX=MID
  618.       YY=3
  619.       B[40,(YY-3)*8,600,(YY-3)*8+12,MSG$,1]
  620.       B[(MID*8)-5,(8*(YY-1))+4,(MID*8)+(SX*8)+5,(8*(YY-1))+19,"",1]
  621.       B[(MID*8)-2,(8*(YY-1))+6,(MID*8)+(SX*8)+2,(8*(YY-1))+17,"",0]
  622.       Locate XX,YY
  623.       Ink 0
  624.       Bar 0,0 To 7,7
  625.    End If 
  626.    Locate XX,YY
  627.    Print String$(" ",SX);
  628.    XC=0
  629.    MN=0
  630.    PX=0
  631.    L=Len(ED$)
  632.    If L>=SX
  633.       PX=L-SX
  634.    End If 
  635.    Gr Writing 2
  636.    Do 
  637.       Gosub _DED
  638.       GRX=X Curs*8
  639.       GRY=YY*8
  640.       Bar GRX,GRY To GRX+7,GRY+7
  641.       Repeat 
  642.          A$=Inkey$
  643.          If CHK=1 and Timer>=1000
  644.             Bar GRX,GRY To GRX+7,GRY+7
  645.             Goto _END
  646.          End If 
  647.          S=Scancode
  648.          If(CHK=1) and(A$<>"") and(Scancode=0)
  649.             Timer=0
  650.          End If 
  651.       Until A$<>""
  652.       Bar GRX,GRY To GRX+7,GRY+7
  653.       F=1
  654.       If A$=Chr$(13)
  655.          Exit 
  656.       End If 
  657.       If A$=Chr$(27)
  658.          ED$="_Esc_"
  659.          Exit 
  660.       End If 
  661.       If S=65 and XC+PX>MN
  662.          ED$=Left$(ED$,XC+PX-1)+Mid$(ED$,PX+XC+1)
  663.          E=1
  664.          L=L-1
  665.          S=79
  666.       End If 
  667.       If S=70 and XC+PX<L
  668.          ED$=Left$(ED$,XC+PX)+Mid$(ED$,PX+XC+2)
  669.          E=1
  670.          L=L-1
  671.          F=0
  672.       End If 
  673.       If S=79 and PX+XC>MN
  674.          F=0
  675.          If XC=0
  676.             PX=PX-1
  677.          Else 
  678.             XC=XC-1
  679.          End If 
  680.       End If 
  681.       If S=78 and PX+XC<L
  682.          F=0
  683.          If XC=SX
  684.             PX=PX+1
  685.          Else 
  686.             XC=XC+1
  687.          End If 
  688.       End If 
  689.       If F
  690.          If A$>=" " and L<ML
  691.             ED$=Left$(ED$,PX+XC)+A$+Mid$(ED$,PX+XC+1)
  692.             L=L+1
  693.             If L>SX
  694.                If XC>=SX
  695.                   PX=PX+1
  696.                Else 
  697.                   XC=XC+1
  698.                End If 
  699.             Else 
  700.                XC=XC+1
  701.             End If 
  702.          End If 
  703.       End If 
  704.    Loop 
  705.    Goto _END
  706.    _DED:
  707.    Locate XX,YY
  708.    Print Mid$(ED$,PX+1,SX);
  709.    If E
  710.       If X Curs<XX+SX
  711.          Print " ";
  712.          E=0
  713.       End If 
  714.    End If 
  715.    Locate Min(XX+XC,XX+SX-1),YY
  716.    Return 
  717.    _END:
  718.    Gr Writing 1
  719.    If CCCC=1
  720.       Screen Close 7
  721.    End If 
  722. End Proc
  723.  
  724. Procedure R[X1,Y1,X2,Y2]
  725.    
  726.    X3=X Screen(X Mouse)
  727.    Y3=Y Screen(Y Mouse)
  728.    M=Mouse Key
  729.    
  730.    AN=0
  731.    
  732.    If X3<X1 or X3>X2 or Y3<Y1 or Y3>Y2 or M=0
  733.       Pop Proc
  734.    End If 
  735.    
  736.    AN=M
  737.    
  738. End Proc
  739.  
  740. Procedure B[X1,Y1,X2,Y2,A$,IN]
  741.    
  742.    Dim A$(5)
  743.    I=0
  744.    IO=0
  745.    B=0
  746.    While I<Len(A$)
  747.       I=Instr(A$,"|",I+1)
  748.       If I=0
  749.          I=Len(A$)+1
  750.       End If 
  751.       A$(B)=Mid$(A$,IO+1,I-IO-1)
  752.       IO=I
  753.       Inc B
  754.    Wend 
  755.    
  756.    If IN=1
  757.       C1=1
  758.       C2=2
  759.    Else 
  760.       C1=2
  761.       C2=1
  762.    End If 
  763.    
  764.    Ink 0
  765.    
  766.    If IN=0 or IN=1
  767.       
  768.       Bar X1,Y1 To X2,Y2
  769.       Ink C1
  770.       Box X1,Y1 To X2,Y2
  771.       Box X1+1,Y1 To X2-1,Y2
  772.       Ink C2
  773.       Polyline X1+1,Y2 To X2,Y2 To X2,Y1
  774.       Polyline X1+1,Y2 To X2-1,Y2 To X2-1,Y1+1
  775.       
  776.       If IN=1
  777.          Plot X1+2,Y1+1,1
  778.          Plot X1+3,Y1+1,1
  779.       End If 
  780.       
  781.    End If 
  782.    
  783.    If IN=2
  784.       Bar X1+2,Y1+1 To X2-2,Y2-1
  785.    End If 
  786.    
  787.    H#=((Y2-Y1)-(B*8))/(B+1)
  788.    Y#=Y1+H#+7
  789.    
  790.    For LOP=0 To B
  791.       
  792.       WID=Text Length(A$(LOP))
  793.       X7=(((X2-X1)/2)+X1)-(WID/2)+1
  794.       
  795.       Gr Writing 0
  796.       
  797.       Ink 2,0
  798.       Text X7+1,Y#,A$(LOP)
  799.       Text X7-1,Y#,A$(LOP)
  800.       Text X7,Y#+1,A$(LOP)
  801.       Text X7,Y#-1,A$(LOP)
  802.       
  803.       Ink 3,0
  804.       Text X7,Y#,A$(LOP)
  805.       Y#=Y#+8+H#
  806.       
  807.       Gr Writing 1
  808.       
  809.    Next LOP
  810.    
  811. End Proc